package com.gem.day17;

import java.lang.reflect.*;

/**
 * 本类用来演示Java反射机制获取类的属性
 * 
 * @author easonsy
 * 2020年8月13日 上午9:00:01
 */
public class ReflectField {
	public static void main(String[] args) throws ClassNotFoundException {
		//获取类的Class实例
		Class<?> c = Class.forName("com.gem.day17.Point");
		//反射
		//获取类中所有公开的属性
		//Field[] fields = c.getFields();
		//获取类中所有的属性包括私有
		Field[] fields = c.getDeclaredFields();
		//遍历
		for (Field f : fields) {
			//System.out.println(f);
			//修饰符[需要转换],数据类型,属性名
			System.out.println(Modifier.toString(f.getModifiers()) + " " + f.getType().getName() + " " + f.getName());
		}
		//反射属性操作
		//获取指定名字的属性
		try {
			Point p = (Point) c.getConstructor().newInstance();//反射创建对象
			Field f = c.getDeclaredField("x");
			//注意:访问私有化属性时,需要设置权限,否则抛出访问权限不足异常
			f.setAccessible(true);
			System.out.println("修改前: " + f.get(p));
			//设置属性值
			f.set(p, 10);
			System.out.println("修改后: " + f.get(p));
		} catch (NoSuchFieldException e) {
			System.err.println("当没有该名字属性的时候会抛出该异常");
		} catch (SecurityException e) {
			System.err.println("安全权限异常");
		} catch (IllegalArgumentException e) {
			System.err.println("非法参数异常");
		} catch (IllegalAccessException e) {
			System.err.println("非法访问异常");
		} catch (InstantiationException e) {
			System.err.println("实例化异常");
		} catch (InvocationTargetException e) {
			System.err.println("方法调用异常");
		} catch (NoSuchMethodException e) {
			System.err.println("没有对应方法时抛出该异常");
		}
	}
}
